package com.lovo.project.vo;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * @title 结果集
 * @author: luo
 * @date: 2020/11/3 10:40
 */
@Data
public class ResultVO {
    /**状态码*/
    private Integer code;
    /**状态消息*/
    private String msg;
    /**需要返回的数据*/
    private Object data;

    private static ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 失败时返回的结果集
     * @param codeEnum
     * @return
     */
    public static ResultVO fail(Object codeEnum) {
        ResultVO result = new ResultVO();
        try {
            Integer code = (Integer) codeEnum.getClass().getMethod("getCode").invoke(codeEnum);
            String msg = (String) codeEnum.getClass().getMethod("getMsg").invoke(codeEnum);
            result.setCode(code);
            result.setMsg(msg);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 成功时返回的结果集
     *
     * @return 携带成功信息的结果集
     */
    public static ResultVO success() {
        ResultVO result = new ResultVO();
        result.setCode(1000);
        result.setMsg("成功");
        return result;
    }


    /**
     * 向结果集中追加数据
     *
     * @param data 追加的数据
     * @return 成功的构造器
     */
    public ResultVO add(Object data) {
        this.data = data;
        return this;
    }

    /**
     *
     * 向结果集中追加键值对类型的数据
     *
     * @param key 数据键
     * @param value 数据内容
     * @return 追加数据后的结果集
     */
    @SuppressWarnings("unchecked")
    public ResultVO addMap(String key, String value) {
        if (data == null) {
            data = new HashMap<String, Object>(16);
        }
        ((Map<String, Object>)data).put(key, value);
        return this;
    }

    /**
     * 将结果集转换为json格式
     * @return
     */
    public String toJson() {
        try {
            return objectMapper.writeValueAsString(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


}
